import * as dayjs from 'dayjs';
import GroupScore from './group-score';

export const answerExcelHeader = {
  name: '姓名',
  num: '工号',
  tel: '手机号',
  startTime: '开始时间',
  endTime: '提交时间',
  duringTime: '作答时长',
  gender: '性别',
  maritalStatus: '婚姻状态',
  childrenSituation: '子女情况',
  age: '年龄',
  education: '文化程度',
  workUnit: '工作单位',
  affiliated: '附属单位',
  jobPosition: '工作职位',
  operatingPost: '工作岗位',
  email: '电子邮箱',
  XLZK_1: 'XLZK_1',
  XLZK_2: 'XLZK_2',
  XLZK_3: 'XLZK_3',
  XLZK_4: 'XLZK_4',
  XLZK_5: 'XLZK_5',
  XLZK_6: 'XLZK_6',
  XLZK_7: 'XLZK_7',
  XLZK_8: 'XLZK_8',
  XLZK_9: 'XLZK_9',
  XLZK_10: 'XLZK_10',
  XLZK_11: 'XLZK_11',
  XLZK_12: 'XLZK_12',
  XLZK_13: 'XLZK_13',
  XLZK_14: 'XLZK_14',
  XLZK_15: 'XLZK_15',
  XLZK_16: 'XLZK_16',
  XLZK_17: 'XLZK_17',
  XLZK_18: 'XLZK_18',
  XLZK_19: 'XLZK_19',
  XLZK_20: 'XLZK_20',
  XLZK_21: 'XLZK_21',
  XLZK_22: 'XLZK_22',
  XLZK_23: 'XLZK_23',
  XLZK_24: 'XLZK_24',
  XLZK_25: 'XLZK_25',
  XLZK_26: 'XLZK_26',
  XLZK_27: 'XLZK_27',
  XLZK_28: 'XLZK_28',
  XLZK_29: 'XLZK_29',
  XLZK_30: 'XLZK_30',
  XLZK_31: 'XLZK_31',
  XLZK_32: 'XLZK_32',
  XLZK_33: 'XLZK_33',
  XLZK_34: 'XLZK_34',
  XLZK_35: 'XLZK_35',
  XLZK_36: 'XLZK_36',
  XLZK_37: 'XLZK_37',
  XLZK_38: 'XLZK_38',
  XLZK_39: 'XLZK_39',
  XLZK_40: 'XLZK_40',
  XLZK_41: 'XLZK_41',
  XLZK_42: 'XLZK_42',
  XLZK_43: 'XLZK_43',
  XLZK_44: 'XLZK_44',
  XLZK_45: 'XLZK_45',
  XLZK_46: 'XLZK_46',
  XLZK_47: 'XLZK_47',
  XLZK_48: 'XLZK_48',
  XLZK_49: 'XLZK_49',
  XLZK_50: 'XLZK_50',
  XLZK_51: 'XLZK_51',
  XLZK_52: 'XLZK_52',
  XLZK_53: 'XLZK_53',
  XLZK_54: 'XLZK_54',
  XLZK_55: 'XLZK_55',
  XLZK_56: 'XLZK_56',
  XLZK_57: 'XLZK_57',
  XLZK_58: 'XLZK_58',
  XLZK_59: 'XLZK_59',
  XLZK_60: 'XLZK_60',
  XLZK_61: 'XLZK_61',
  XLZK_62: 'XLZK_62',
  A1: 'A1',
  A2: 'A2',
  A3: 'A3',
  A4: 'A4',
  A5: 'A5',
  A6: 'A6',
  A7: 'A7',
  A8: 'A8',
  A9: 'A9',
  A10: 'A10',
  A11: 'A11',
  A12: 'A12',
  A13: 'A13'
};

/**
 * 计算持续时间
 */
export const calculateDurningTime = (startTime: number, endTime: number) => {
  if (endTime && startTime) {
    return `${(endTime - startTime) / 1000}秒`;
  }

  return '';
};

// 答题分数：查询到所有人的 answer 根据 questionnaireUuid => mergeList => answerList
// 基本信息：questionnarieUuid => mergeList => User
// 问卷当前用户信息：questionnaireUuid => mergeList
export const generateAnswerData = (
  mergeList,
  userListAnswer
): Record<keyof typeof answerExcelHeader, string>[] => {
  const answerDataItemProto = { ...answerExcelHeader };
  const answerData: Record<keyof typeof answerExcelHeader, string>[] = [];

  for (const key in answerDataItemProto) {
    if ({}.hasOwnProperty.call(answerDataItemProto, key)) {
      answerDataItemProto[key] = '';
    }
  }

  for (const mergeData of mergeList) {
    const answerDataItem = { ...answerDataItemProto };
    const {
      startTime,
      endTime,
      email,
      uuid
    } = mergeData;

    const {
      tel,
      name,
      num,
      genderName,
      maritalStatusName,
      childrenSituationName,
      ageName,
      educationName,
      workUnit,
      affiliated,
      jobPosition,
      operatingPost
    } = mergeData.User;

    // merge
    answerDataItem.startTime = startTime ? dayjs(startTime).format() : startTime;
    answerDataItem.endTime = endTime ? dayjs(endTime).format() : endTime;
    answerDataItem.duringTime = calculateDurningTime(
      startTime,
      endTime
    );
    answerDataItem.email = email;

    // user
    answerDataItem.name = name;
    answerDataItem.num = num;
    answerDataItem.tel = tel;
    answerDataItem.gender = genderName;
    answerDataItem.maritalStatus = maritalStatusName;
    answerDataItem.childrenSituation = childrenSituationName;
    answerDataItem.age = ageName;
    answerDataItem.education = educationName;
    answerDataItem.workUnit = workUnit;
    answerDataItem.affiliated = affiliated;
    answerDataItem.jobPosition = jobPosition;
    answerDataItem.operatingPost = operatingPost;

    // answer
    const userAnswer = userListAnswer.find((userItem) => userItem.uuid === uuid);

    if (userAnswer) {
      console.info('will new GroupScore tel:', tel)
      const groupScore = new GroupScore(userAnswer.Answers.map((item) => item.dataValues));

      groupScore.scoreList.forEach((score, index) => {
        answerDataItem[`XLZK_${index + 1}`] = `${score}`;
      });

      groupScore.currentAnswerList.forEach((groupAnswer, index) => {
        answerDataItem[`A${index + 1}`] = groupAnswer.totalScore;
      });

      answerData.push(answerDataItem);
    }
  }

  return answerData;
};

export default { generateAnswerData, answerExcelHeader };
